package util;

import com.os.sys.service.bean.UserInfo;
import com.os.util.BPConstants;
import com.os.util.Tools;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.*;
@Service
@Slf4j
public class FileService {
    public static final String SUFFIX_JPG = ".jpg";
    //String base = request.getSession().getServletContext().getRealPath("");
    private String dirBase = "";
    private String path = "//files//pub";
    /**
     * 生成相对目录
     * @param userinfo
     * @param file_name 可选，如果填写的文件名，则生成的目录带有文件名，否则生成的是文件目录
     * @param filetype_key 文件类型标识，如/others/doc/ 将作为顶级分类
     * @return 示例  /others/doc/2018/01/12/
     */
    public String generateComparePath(String path_base, UserInfo userinfo, String file_name, String filetype_key){
        String filePath =  "/" + Tools.getTimeNowByFormat("yyyy")
                + "/" + Tools.getTimeNowByFormat("MM")
                + "/" + Tools.getTimeNowByFormat("dd");
        if(filetype_key.length()>0){
            if(filetype_key.indexOf("/")==0){
                filePath = filetype_key + filePath ;
            }else{
                filePath = "/"+filetype_key+filePath;
            }
        }
        File folder = new File(path_base+filePath);
        if (!folder.exists()) {
            // 如果文件夹不存在,则创建之.
            folder.mkdirs();
        }
        if(file_name!=null && file_name.length()>0){
            //加入文件名
            String ext = file_name.substring(file_name.lastIndexOf(".")+1);
            String timestr = Tools.getTimeMillStr();
            String newName = file_name.substring(0,file_name.lastIndexOf("."))+"_"+timestr + "."+ext;
            filePath = filePath + "/" + newName;
            filePath = filePath.replaceAll("\\\\", "/");
        }
        return filePath;
    }

    /**
     * @param userinfo 用于提取公司名，如果没有公司名，那么不能上传文件
     * @param fileName 文件的名称，如: 关于XX的公文.doc
     * @param file_type  文件类别，如 0:公共文件other， 1word，2common
     *        依据不同的文件类型，可能要修改文件的上级目录
     * @return
     */
    public String generatePath(UserInfo userinfo,String fileName, int file_type){
        String base = BPConstants.FILE_BASE; //ParamBO.getInstance().getParamValue(ParamBO.param_key_path_base);
        //String rootPath = base+"\\";
        String rootPath = base;
        String file_type_name="other";
        if(file_type==1){
            file_type_name ="word";
        }else if(file_type==2){
            file_type_name ="common";
        }else if(file_type==3){
            file_type_name ="temp";
        }
//		SysOrg com  = userinfo.getMyOrg_Com();
//		if(com==null){
//			log.error("未找到用户所属组织机构，不能生成文件路径！");
//			return "";
//		}
//		String comName = com.getOrg_name();
        String filePath = rootPath
                + file_type_name
                + "/" + Tools.getTimeNowByFormat("yyyy")
                + "/" + Tools.getTimeNowByFormat("MM")
                + "/" + Tools.getTimeNowByFormat("dd");
        File folder = new File(filePath);
        if(!folder.exists()){
            //如果文件夹不存在,则创建
            folder.mkdirs();
        }
        //重新命名，增加时间戳，保证文件不重
        //文件扩展名
        String ext = fileName.substring(fileName.lastIndexOf(".")+1);
        String timestr = Tools.getTimeMillStr();
        String newName = fileName.substring(0,fileName.lastIndexOf("."))+"_"+timestr + "."+ext;
        setFilesNewName(newName);
        //filePath += "/" + fileName;
        filePath += "/" + newName;
        filePath = filePath.replaceAll("\\\\", "/");
        log.debug(filePath);
        return filePath;
    }
    public String files_new_name="";
    public String getFilesNewName(){
        return this.files_new_name;
    }
    public void setFilesNewName(String files_new_name){
        this.files_new_name=files_new_name;
    }
    public String getPath(UserInfo userinfo,String fileName, int file_type){
        //String base = ParamBO.getInstance().getParamValue(ParamBO.param_key_path_base);
        //String rootPath = base+"\\";
        //String rootPath = base;
        String file_type_name="other";
        if(file_type==1){
            file_type_name ="word";
        }else if(file_type==2){
            file_type_name ="common";
        }
//		SysOrg com  = userinfo.getMyOrg_Com();
//		if(com==null){
//			log.error("未找到用户所属组织机构，不能生成文件路径！");
//			return "";
//		}
//		String comName = com.getOrg_name();
        String filePath =  file_type_name
                + "/" + Tools.getTimeNowByFormat("yyyy")
                + "/" + Tools.getTimeNowByFormat("MM")
                + "/" + Tools.getTimeNowByFormat("dd");
        File folder = new File(filePath);
        if(!folder.exists()){
            //如果文件夹不存在,则创建
            folder.mkdirs();
        }
        //重新命名，增加时间戳，保证文件不重
        //文件扩展名
		/*String ext = fileName.substring(fileName.lastIndexOf(".")+1);
      	String timestr = Tools.getTimeMillStr();
     	String newName = fileName.substring(0,fileName.lastIndexOf("."))+"_"+timestr + "."+ext;*/
        String newName = getFilesNewName();
        //filePath += "/" + fileName;
        filePath += "/" + newName;
        filePath = filePath.replaceAll("\\\\", "/");
        log.debug(filePath);
        return filePath;
    }
//    /**
//     * 保存文件,注:该文件中需要存放base64码,由高拍仪取得的
//     * 先要转成对应的文件,然后把相关信息存入数据库
//     * @param  fileInfoList 从前台接收到的文件列表
//     * @return
//     */
//    public boolean saveFileList(List<FileInfo> fileInfoList){
//        FileInfoDao fileDao = DaoFactory.getFileInfoDao();
//        try {
//            for(int i=0; i<fileInfoList.size(); i++){
//                FileInfo fileInfo = fileInfoList.get(i);
//                BASE64Decoder decode = new BASE64Decoder();
//                log.debug("后台接收: base64, 长度 = "+fileInfo.getFile_base64().length());
//                byte fileData[] = decode.decodeBuffer(fileInfo.getFile_base64());
//                //int file_size_k = fileData.length/1000;
//                int file_size_k = fileData.length;
//                fileInfo.setFile_size(file_size_k);
//                String fileNameFull = getDirBase()+fileInfo.getFile_url();
//                if(fileInfo.getFile_url().length()==0){
//                    fileNameFull = getDirBase() + this.path +"//" + Tools.getTimeNow("yyyyMMddHHmmss")+"_"+fileInfo.getFile_name()+".bmp";
//                }
//                log.debug("fileNameFull = "+fileNameFull);
//                //上传文件,如果文件名完全一样,不会复盖
//                saveFile(fileNameFull, fileData);
//                //更新DAO
//                if(fileInfo.getFile_id()==0){
//                    fileDao.insert(fileInfo);
//                }else{
//                    fileDao.update(fileInfo);
//                }
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return true;
//    }
//    /**
//     * 提取某个业务的所有附件(图片)
//     * @param  busi_uid
//     * @return
//     */
//    public List<FileInfo> getFileList(String busi_uid){
//        FileInfoDao fileDao = DaoFactory.getFileInfoDao();
//        List paramList = new ArrayList();
//        if(busi_uid!=null && busi_uid.length()>0){
//            paramList.add(new Param("busi_uid", busi_uid));
//        }
//        List<FileInfo> fileInfoList = fileDao.selectByParam(paramList);
//        return fileInfoList;
//    }
//    /**
//     * 按UID提取文件信息
//     * @param file_uid
//     * @return
//     */
//    public FileInfo getFileInfoByUid(String file_uid)
//    {
//        if (file_uid!=null && file_uid.length()>0) {
//            FileInfoDao fileDao = DaoFactory.getFileInfoDao();
//            List paramList = new ArrayList();
//            paramList.add(new Param("file_uid", file_uid));
//            List<FileInfo> fileInfoList = fileDao.selectByParam(paramList);
//            if(fileInfoList.size()>0){
//                return fileInfoList.get(0);
//            }
//        }
//        return null;
//    }

    private byte[] readFile(File photo) {
        FileInputStream in = null;
        try {
            in = new FileInputStream(photo);
            byte[] result = new byte[in.available()];
            in.read(result);
            return result;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return null;
    }



//	public byte[] getFileBase64(String file_url) {
//		File photo = new File(file_url);
//		if ((photo.exists()) && (photo.isFile())) {
//			return readFile(photo);
//		}
//		return null;
//	}

    private void saveNewPhoto(String idCard, String year, String regionCode,
                              byte[] content) {
        saveFile(getPhotoDir(year, regionCode) + idCard + ".jpg", content);
    }

//	private void saveNewCardImage(String idCard, String regionCode,
//			byte[] content) {
//		saveFile(getIdCardDir(regionCode) + idCard + ".jpg", content);
//	}
//
//	private void saveIdCardPhoto(String idCard, String regionCode,
//			byte[] content) {
//		saveFile(getIdCardPhotoDir(regionCode) + idCard + ".jpg", content);
//	}
//
//	private void saveNewScanImage(String idCard, String regionCode,
//			byte[] content) {
//		saveFile(getScanFileDir(regionCode) + idCard + File.separatorChar
//				+ System.currentTimeMillis() + ".jpg", content);
//	}

    public void saveFile(String fileNameFull, byte[] content) {
        log.debug("保存文件:"+fileNameFull);
        FileOutputStream out = null;
        try {
            File photoFile = new File(fileNameFull);
            if (!photoFile.getParentFile().exists())
                photoFile.getParentFile().mkdirs();
//			if(photoFile.exists()){
//				//文件已存在
//				return;
//			}
            if (!photoFile.exists())
                photoFile.createNewFile();
            out = new FileOutputStream(photoFile);
            out.write(content);
            out.flush();
            out.close();
            out = null;
            photoFile = null;
        } catch (Exception e) {
            e.printStackTrace();

            if (out != null)
                try {
                    out.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
        } finally {
            if (out != null)
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
        }
    }

//	public void updatePicture(ScPubFilepho scPubFilepho) {
//		if ("year".equals(scPubFilepho.getResv3())) {
//			saveNewPhoto(scPubFilepho.getResv1(), scPubFilepho.getResv2(),
//					scPubFilepho.getRegionCode(), scPubFilepho.getContent());
//		} else if ("card".equals(scPubFilepho.getResv2())) {
//			saveNewCardImage(scPubFilepho.getResv1(),
//					scPubFilepho.getRegionCode(), scPubFilepho.getContent());
//		} else if ("scan".equals(scPubFilepho.getResv3())) {
//			saveNewScanImage(scPubFilepho.getResv1(),
//					scPubFilepho.getRegionCode(), scPubFilepho.getContent());
//		}
//	}

//	public void delePicture(String fileGuid, String photoYear) {
//		String[] param = getIdCardAndRegionCode(fileGuid);
//		String idCard = param[0];
//		String regionCode = param[1];
//		delePictureByIdNum(idCard, photoYear, regionCode);
//	}

    public void delePictureByIdNum(String idCard, String year, String regionCode) {
        File photo = new File(getPhotoDir(year, regionCode) + idCard + ".jpg");
        if ((photo.exists()) && (photo.isFile())) {
            photo.delete();
        }
        photo = null;
    }

    public boolean isFileExist(String fileNameFull){
        File file = new File(fileNameFull);
        if ((file.exists()) && (file.isFile())) {
            return true;
        }
        return false ;
    }

//	public void deleCardScan(String fileGuid) {
//		String[] param = getIdCardAndRegionCode(fileGuid);
//		if ((param == null) || (param.length != 2))
//			return;
//		String idCard = param[0];
//		String regionCode = param[1];
//		deleteCardImgByIdNum(idCard, regionCode);
//	}

    public void deleteFile(String file_name_full) {
        log.debug("dele file:: file_name_full = "+file_name_full);
        if(file_name_full==null || file_name_full.indexOf(".")<0){
            return;
        }
        File photo = new File(file_name_full);
        photo.delete();
        photo.deleteOnExit();
        photo = null;
    }

//    /**
//     * 递归删除目录下的所有文件及子目录下所有文件
//     * @param dir 将要删除的文件目录
//     * @return boolean Returns "true" if all deletions were successful.
//     *                 If a deletion fails, the method stops attempting to
//     *                 delete and returns "false".
//     */
//    private static boolean deleteDir(File dir) {
//        if (dir.isDirectory()) {
//            String[] children = dir.list();
//            //递归删除目录中的子目录下
//            for (int i=0; i<children.length; i++) {
//                boolean success = deleteDir(new File(dir, children[i]));
//                if (!success) {
//                    return false;
//                }
//            }
//        }
//        // 目录此时为空，可以删除
//        return dir.delete();
//    }

    public String getPhotoBaseDir() {
        return getDirBase() + "/photo/";
    }
    private String getDirBase() {
//		String ctxDir = System.getProperty("MCASC_HOME");
//		if (StringUtils.isEmpty(ctxDir)) {
//			String zdDir = "";
//			try {
//				zdDir = StyleBuff.getInstance().getParamValueByCode("909066");
//				if (!StringUtils.isEmpty(zdDir))
//					return zdDir + ":/MCASC_PHOTO/";
//			} catch (Exception localException) {
//			}
//
//		}
        return dirBase;
        //return "C:/APR_PHOTO";
    }

    public String getPhotoDir(String year, String regionCode) {
        return getPhotoBaseDir() + year + File.separatorChar
                + regionCode.substring(0, 6) + File.separatorChar;
    }

//	public String getIdCardDir(String regionCode) {
//		return getCardImageBaseDir() + regionCode.substring(0, 6)
//				+ File.separatorChar;
//	}
//
//	public String getIdCardPhotoDir(String regionCode) {
//		return getIdCardPhotoBaseDir() + regionCode.substring(0, 6)
//				+ File.separatorChar;
//	}
//
//	public String getScanFileDir(String regionCode) {
//		return getScanFileBaseDir() + regionCode.substring(0, 6)
//				+ File.separatorChar;
//	}

//	public ArrayList getOtherScan(String fileGuid) {
//		ArrayList retList = new ArrayList();
//		try {
//			String[] param = getIdCardAndRegionCode(fileGuid);
//			if ((param == null) || (param.length != 2))
//				return retList;
//			String idCard = param[0];
//			String regionCode = param[1];
//			File scanDir = new File(getScanFileDir(regionCode) + idCard);
//			if ((scanDir.exists()) && (scanDir.isDirectory())) {
//				String[] files = scanDir.list();
//				for (int i = 0; i < files.length; i++) {
//					retList.add(files[i].toString());
//					files[i] = null;
//				}
//			}
//			scanDir = null;
//		} catch (Exception e) {
//			System.out.println("无照片目录，请设置909066参数指定照片存放磁盘号！");
//		}
//		return retList;
//	}

//	public byte[] getOtherScanFile(String puGuid, String fileGuid) {
//		String[] param = getIdCardAndRegionCode(fileGuid);
//		if ((param == null) || (param.length != 2))
//			return null;
//		String idCard = param[0];
//		String regionCode = param[1];
//		File scanFile = new File(getScanFileDir(regionCode) + idCard
//				+ File.separatorChar + puGuid);
//		return readFile(scanFile);
//	}

//	/**
//	 * 移动某人附件信息.
//	 *
//	 * @param regionCodeOld
//	 *            原区划.
//	 * @param regionCodeNew
//	 *            新区划.
//	 * @param cardId
//	 *            身份证号.
//	 * @param fileType
//	 *            文件类型. photo: 存放历年的照片。 scanfile: 存放扫描档案信息 idcard: 存放身份证扫描件。
//	 *            格式为：idcard\六位区域码\身份证号.JPG idcardphoto:存放身份证的照片（人像照片）
//	 *            格式为：idcardphoto\六位区域码\身份证号.JPG
//	 */
//	public boolean moveFiles(String fileguid, String regionCodeOld,
//			String regionCodeNew, String idCard, String fileType) {
//		try {
//			System.out.println("开始迁移相关附件...");
//			String srcFile = "";
//			String destPath = "";
//			File fileSrc = null;
//			File fileDest = null;
//			if (true || fileType.equalsIgnoreCase("scanfile")) {
//				// 扫描件.
//				File scanDir = new File(getScanFileDir(regionCodeOld) + idCard);
//				if ((scanDir.exists()) && (scanDir.isDirectory())) {
//					String[] files = scanDir.list();
//					for (int i = 0; i < files.length; i++) {
//						String filename = files[i].toString();
//						srcFile = getScanFileDir(regionCodeOld) + idCard + "/"
//								+ filename;
//						destPath = getScanFileDir(regionCodeNew) + idCard + "/"
//								+ filename;
//						System.out.println("扫描件 - 源   = " + srcFile);
//						System.out.println("扫描件 - 目标 = " + destPath);
//						File src_file = new File(srcFile);
//						if (!src_file.exists()) {
//							continue;
//						}
//						this.copyFile(src_file, new File(destPath));
//						src_file.delete();
//					}
//				}
//
//			}
//			if (true || fileType.equalsIgnoreCase("idcard")) {
//				// 身份证扫描件
//				srcFile = getIdCardDir(regionCodeOld) + idCard + ".jpg";
//				destPath = getIdCardDir(regionCodeNew) + idCard + ".jpg";
//				File src_file = new File(srcFile);
//				if (src_file.exists()) {
//					this.copyFile(new File(srcFile), new File(destPath));
//					src_file.delete();
//					System.out.println("身份证扫描件 - 源   = " + srcFile);
//					System.out.println("身份证扫描件 - 目标 = " + destPath);
//				}
//			}
//			if (true || fileType.equalsIgnoreCase("idcardphoto")) {
//				// 人像照片
//				srcFile = getIdCardPhotoDir(regionCodeOld) + idCard + ".jpg";
//				destPath = getIdCardPhotoDir(regionCodeNew) + idCard + ".jpg";
//				File src_file = new File(srcFile);
//				if (src_file.exists()) {
//					this.copyFile(src_file, new File(destPath));
//					src_file.delete();
//					System.out.println("人像照片 - 源   = " + srcFile);
//					System.out.println("人像照片 - 目标 = " + destPath);
//				}
//			}
//			if (true || fileType.equalsIgnoreCase("photo")) {
//				String photobase = getPhotoBaseDir();
//				// 历年照片
//				ArrayList yearPicList = getPictureYearList(fileguid);
//				// 只能一个一个移动了.
//				System.out.println("..........开始迁移各年度照片...........");
//				for (int i = 0; i < yearPicList.size(); i++) {
//					String year = (String) yearPicList.get(i);
//					srcFile = photobase + year + File.separatorChar
//							+ regionCodeOld + File.separatorChar + idCard
//							+ ".jpg";
//					destPath = photobase + year + File.separatorChar
//							+ regionCodeNew + File.separatorChar + idCard
//							+ ".jpg";
//					System.out.println("源 = " + srcFile);
//					System.out.println("目标 = " + destPath);
//					File src_file = new File(srcFile);
//					if (!src_file.exists()) {
//						continue;
//					}
//					this.copyFile(src_file, new File(destPath));
//					src_file.delete();
//				}
//				System.out.println("..........各年度照片迁移完成...........");
//			}
//			// File file = new File(srcFile);
//			// Destination directory
//			// File dir = new File(destPath);
//			// Move file to new directory
//			// 还源目本身及本子文件移动到目标文件夹里.(做为子目录移入)
//			// boolean success = file.renameTo(new File(dir, file.getName()));
//			System.out.println("迁移附件完成...");
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		return true;
//	}

    public void copyFile(String file_source, String file_target){
        file_source = file_source.replace("\\", "/");
        file_target = file_target.replace("\\", "/");
        log.debug("file_source new = "+file_source);
        log.debug("file_target new = "+file_target);
        File sourceFile = new File(file_source);
        File targetFile = new File(file_target);
        this.copyFile(sourceFile, targetFile);
    }
    /**
     * 复制文件.
     *
     * @param sourceFile
     * @param targetFile
     * @throws IOException
     */
    private void copyFile(File sourceFile, File targetFile) {

        try {
            if (!sourceFile.exists()) {
                return;
            }
            // 新建文件输入流并对它进行缓冲
            FileInputStream input = new FileInputStream(sourceFile);
            BufferedInputStream inBuff = new BufferedInputStream(input);
            // 新建文件输出流并对它进行缓冲
            if (!targetFile.exists()) {
                targetFile.getParentFile().mkdirs();
                targetFile.createNewFile();
            }
            FileOutputStream output = new FileOutputStream(targetFile);
            BufferedOutputStream outBuff = new BufferedOutputStream(output);
            // 缓冲数组
            byte[] b = new byte[1024 * 5];
            int len;
            while ((len = inBuff.read(b)) != -1) {
                outBuff.write(b, 0, len);
            }
            // 刷新此缓冲的输出流
            outBuff.flush();
            // 关闭流
            inBuff.close();
            outBuff.close();
            output.close();
            input.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    /**
     * 提取图片的Base64码
     * @param fileNameFull
     * @return
     */
    //图片转化成base64字符串
    public static String getFileBase64(String fileNameFull)
    {//将图片文件转化为字节数组字符串，并对其进行Base64编码处理
        //String fileNameFull = "d://test.jpg";//待处理的图片
        InputStream in = null;
        byte[] data = null;
        //读取图片字节数组
        try
        {
            in = new FileInputStream(fileNameFull);
            data = new byte[in.available()];
            in.read(data);
            in.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        //对字节数组Base64编码
        BASE64Encoder encoder = new BASE64Encoder();
        return encoder.encode(data);//返回Base64编码过的字节数组字符串
    }
    /**
     * Base64转成文件
     * @param strBase64
     * @param fileNameFull
     * @throws IOException
     */
    public void base64ToFile(String strBase64, String fileNameFull) throws IOException {
        String string = strBase64;
        //String fileName = "d:/gril2.gif"; //生成的新文件
        try {
            // 解码，然后将字节转换为文件
            byte[] bytes = new BASE64Decoder().decodeBuffer(string);   //将字符串转换为byte数组
            ByteArrayInputStream in = new ByteArrayInputStream(bytes);
            byte[] buffer = new byte[1024];
            FileOutputStream out = new FileOutputStream(fileNameFull);
            int bytesum = 0;
            int byteread = 0;
            while ((byteread = in.read(buffer)) != -1) {
                bytesum += byteread;
                out.write(buffer, 0, byteread); //文件写操作
            }
        } catch (IOException ioe) {
            ioe.printStackTrace();
        }
    }

//    /**
//     * 执行压缩操作
//     * @param srcPathName 需要被压缩的文件夹
//     * @param targetPathName  压缩包完成路径 如  c:/file.zip
//     */
//    public void compressExe(String srcPathName, String targetPathName) {
//        File srcdir = new File(srcPathName);
//        File zipFile = new File(targetPathName);
//        if (!srcdir.exists()){
//            throw new RuntimeException(srcPathName + "不存在！");
//        }
//
//        Project prj = new Project();
//        Zip zip = new Zip();
//        //无文件时是否创建压缩包
//        WhenEmpty empty = new WhenEmpty();
//        empty.setValue("create");
//        zip.setWhenempty(empty);
//        zip.setEncoding("gbk");
//        zip.setProject(prj);
//        zip.setDestFile(zipFile);
//        FileSet fileSet = new FileSet();
//        fileSet.setProject(prj);
//        fileSet.setDir(srcdir);
//        //fileSet.setIncludes("**/*.java"); //包括哪些文件或文件夹 eg:zip.setIncludes("*.java");
//        //fileSet.setExcludes(...); //排除哪些文件或文件夹
//        zip.addFileset(fileSet);
//        zip.execute();
//    }
//
//    /**
//     * 把文件压到zip包中
//     * @param userinfo
//     * @param List<FileInfo> fileInfoList
//     * @param targetZipName 目标文件名称：如 项目单位原始资料.zip或者 项目单位原始资料 或者为空（系统自动生成文件名）
//     * @param map 备用参数
//     * @return 压缩包相对路径 如  2018/08/12/xxx_13155872587252.zip
//     */
//    public String compressFileList(UserInfo userinfo, List<FileInfo> fileInfoList, String targetZipName, Map map ){
//
//        String base = ParamBO.getInstance().getParamValue(ParamBO.param_key_path_base);
//        base = base.replace("\\", "/");
//        String time_str = Tools.getTimeMillStr();
//        String date_str = Tools.getTimeNow("yyyyMMdd");
//        String path = base +"/temp/"+date_str+"/"+time_str+"/";
//        if(targetZipName==null || targetZipName.length()==0){
//            targetZipName = Tools.genUID4FileName();
//        }
//        //File dirFile = new File(GenBO.getBasePath()+"/"+time+"/"+fun.getMod_name()+"/com/os/"+mod_name_dir+"/service/bean/");
//        File dirFile = new File(path);
//        if (!dirFile.isDirectory())
//            dirFile.mkdirs();
//
//        for(int i=0; i<fileInfoList.size(); i++){
//            FileInfo fileInfo = (FileInfo)fileInfoList.get(i);
//            String file_source = base+"/"+fileInfo.getFile_url();
//            String file_target = path + "/"+(i+1)+"_"+fileInfo.getFile_name();
//            FileBO.getInstance().copyFile(file_source, file_target);
//        }
//        String comparedPath = FileBO.getInstance().generateComparePath(base, userinfo, "", "");
//        String path_zip = base + comparedPath+"/"+targetZipName+".zip";
//        path_zip = path_zip.replace("//", "/");
//        //执行压缩
//        FileBO.getInstance().compressExe(path, path_zip);
//        File zipFile = new File(path_zip);
//
//        long filesize = FileBO.getInstance().getFileSize(zipFile);
//        log.debug("计算文件大小："+path_zip+"_"+filesize);
//        map.put("filesize", filesize+"");
//        //删除临时文件
//        //FileBO.getInstance().deleteFile(file_target);
//        //FileBO.getInstance().deleteFile(base +"/temp/"+time_str);
//        //FileBO.getInstance().deleteDir(dir)
//        FileBO.getInstance().deleteDir(path, false);
//        String path_return = comparedPath+"/"+targetZipName+".zip";
//        if(path_return.substring(0, 1).equalsIgnoreCase("/")){
//            path_return = path_return.substring(1);
//        }
//        return path_return;
//        //绝对路径
//        //return path_zip ;
//    }

    public String getFileShortName(String file_name_full){
        if(file_name_full.lastIndexOf("/")>=0){
            return file_name_full.substring(file_name_full.lastIndexOf("/")+1);
        }
        if(file_name_full.lastIndexOf("\\")>=0){
            return file_name_full.substring(file_name_full.lastIndexOf("\\")+1);
        }
        return file_name_full ;
    }
    /**
     * 提取某个文件的扩展名   如docx, doc,xls,txt 等
     * @param file_path
     * @return
     */
    public String getFileExt(String file_path){
        String file_type = "";
        if (file_path == null||file_path.equalsIgnoreCase("")||file_path.length()<10) {
            return file_type;
        } else {
            // 获取文件后缀名并转化为写，用于后续比较
            return file_path.substring(file_path.lastIndexOf(".") + 1, file_path.length()).toLowerCase();
        }
    }
    /**
     * 提取某个文件的文件名
     * @param file_path 如d:/aaa/a.txt
     * @param containsFolder 是否包括文件夹, true  返回d:/aaa/a, false 返回a （当containsExt为false时）
     * @param containsName 是否包括文件名, true
     * @param containsExt 是否包括扩展名, true  返回a.txt, false 返回a
     * @return
     */
    public String getFileName(String file_path, boolean containsFolder , boolean containsName, boolean containsExt){
        file_path = file_path.replace("//", "/");
        file_path = file_path.replace("\\", "/");
        //目录部分
        String folder_part = file_path.substring(0,file_path.lastIndexOf("/")+1);
        //如doc
        String ext_part = file_path.substring(file_path.lastIndexOf(".") + 1, file_path.length());
        //如a
        String name_part_without_ext = file_path.substring(file_path.lastIndexOf("/") + 1, file_path.lastIndexOf("."));
        String file_type = "";
        String result = "";
        if(!containsName && !containsFolder && containsExt){
            return ext_part;
        }else if(!containsName){
            return folder_part;
        }else if(containsExt && containsFolder){
            return file_path ;
        }else if(!containsExt && containsFolder){
            return folder_part+name_part_without_ext;
        }
        return result;
    }
//    /**
//     * 对文件名执行重命名
//     * @param file_path_or_name 如  d:/aaa/老文件.txt 或者  老文件.txt
//     * @param new_name 新文件名  如  新文件名1.txt
//     * @param return_contains_ext 返回值是否包括扩展名
//     * @return 重命名后的值
//     */
//    public String renameFile(String file_path_or_name, String new_name, boolean return_contains_ext){
//        file_path_or_name = file_path_or_name.replace("//", "/");
//        file_path_or_name = file_path_or_name.replace("\\", "/");
//        String result = "" ;
//        if(file_path_or_name.indexOf("/")<0){
//            //传入的是文件名 如 a.txt
//            String ext = Tools.getFileExt(file_path_or_name);
//            if(new_name.indexOf(".")<0 && ext.length()>0){
//                result = new_name+"." + ext ;
//            }else{
//                result = new_name ;
//            }
//        }else{
//            //完整个路径
//            String short_name_old_with_ext = this.getFileShortName(file_path_or_name);
//            log.debug("short_name_old_with_ext = "+short_name_old_with_ext);
//            String ext = Tools.getFileExt(file_path_or_name);
//            if(new_name.indexOf(".")<0 && ext.length()>0){
//                String new_name1 = new_name+"." + ext ;
//                result = file_path_or_name.replace(short_name_old_with_ext, new_name1);
//            }else{
//                result = file_path_or_name.replace(short_name_old_with_ext, new_name);
//            }
//        }
//        return result;
//    }

    /**
     * 删除某个文件夹及所有下级文件夹及文件
     * 如果传入的是文件地址，则文件也会被删除，调用时请小心操作
     * @param dir 文件夹地址
     * @param delete_only_children 如果为true,只删除该文件夹的下级, 如果为false则包括文件夹本身全部删除
     * @return true 删除是否成功
     */
    public boolean deleteDir(String dir, boolean delete_only_children){
        if(delete_only_children){
            File dir_file = new File(dir);
            if(dir_file.isDirectory()){
                String[] children = dir_file.list();
                //递归删除目录中的子目录下
                for (int i=0; i<children.length; i++) {
                    boolean success = deleteDir(new File(dir, children[i]));
                    if (!success) {
                        return false;
                    }
                }
                return true;
            }else{
                return deleteDir(new File(dir));
            }
        }else{
            return deleteDir(new File(dir));
        }
    }

    /**
     * 获取文件长度(单位byte)
     * @param file
     */
    public long getFileSize(File file){
        long fileSize = 0;
        if (file.exists() && file.isFile()){
            String fileName = file.getName();
            fileSize = file.length();
            log.debug("文件"+fileName+"的大小是："+file.length());
        }
        return fileSize;
    }

    /**
     * 删除空目录
     * @param dir 将要删除的目录路径
     */
    private void doDeleteEmptyDir(String dir) {
        boolean success = (new File(dir)).delete();
        if (success) {
            System.out.println("Successfully deleted empty directory: " + dir);
        } else {
            System.out.println("Failed to delete empty directory: " + dir);
        }
    }

    /**
     * 递归删除目录下的所有文件及子目录下所有文件
     * @param dir 将要删除的文件目录
     * @return boolean Returns "true" if all deletions were successful.
     *                 If a deletion fails, the method stops attempting to
     *                 delete and returns "false".
     */
    private boolean deleteDir(File dir) {
        if (dir.isDirectory()) {
            String[] children = dir.list();
            //递归删除目录中的子目录下
            for (int i=0; i<children.length; i++) {
                boolean success = deleteDir(new File(dir, children[i]));
                if (!success) {
                    return false;
                }
            }
        }
        // 目录此时为空，可以删除
        log.debug("开始删除："+dir.getPath()+"_"+dir.getAbsolutePath());
        return dir.delete();
    }




//    private static void testGenFileBase64(){
//        FileBO fileBO = new FileBO("E:\\apache-tomcat-5.5.28_dev\\webapps\\dev_approve\\files\\pub\\");
//        String base64 = fileBO.getFileBase64("E:\\apache-tomcat-5.5.28_dev\\webapps\\dev_approve\\files\\pub\\2015_06_28_13_34_36.bmp");
//        log.debug("base64 = "+base64);
//    }
//
//    private static void testSaveFileList(){
//        FileBO fileBO = new FileBO("E:\\apache-tomcat-5.5.28_dev\\webapps\\dev_approve");
//        List fileInfoList = new ArrayList();
//        FileInfo fileInfo = new FileInfo();
//        //一个测试的Base64
//        //String file_base64 = fileBO.getFileBase64("E:\\apache-tomcat-5.5.28_dev\\webapps\\dev_approve\\files\\pub\\2015_06_28_13_34_36.bmp");
//        String file_base64 = fileBO.getFileBase64("C:\\APR_PHOTO\\Img0.jpg");
//        fileInfo.setFile_base64(file_base64);
//        fileInfo.setFile_name("test_2015062901.bmp");
//        fileInfo.setFile_url("\\files\\pub\\test_2015062901.bmp");
//        fileInfoList.add(fileInfo);
//        fileBO.saveFileList(fileInfoList);
//    }
//
//    private static void testCopyFile(){
//        String dirBase = "D:\\files_apr\\other\\2015\\10\\09\\";
//        FileBO fileBO = new FileBO();
//        File sourceFile = new File(dirBase+"清库角本_1444381622073.txt");
//        File targetFile = new File(dirBase+"清库角本_1444381622073_copy.txt");
//        fileBO.copyFile(sourceFile, targetFile);
//    }
//    private static void testGetFileSize(){
//        String dirBase = "E:\\files_apr\\";
//        FileBO fileBO = new FileBO();
//        File sourceFile = new File(dirBase+"menu_1508840120273.xml");
//        log.debug(fileBO.getFileSize(sourceFile));
//    }
//
//    public static void testRenameFile(){
//        FileBO fileBO = new FileBO();
//        //log.debug(fileBO.getFileExt("old.txt"));
//        //fileBO.getFileShortName(file_name_full)
//        //log.debug(fileBO.renameFile("D://xx//old.txt", "new", true));
//        //log.debug(fileBO.renameFile("D://xx//old.txt", "new.txt", true));
//        //log.debug(fileBO.renameFile("old.txt", "new", true));
//        //log.debug(fileBO.renameFile("old", "new", false));
//        log.debug(fileBO.getFileName("a.txt", true, true, false));
//    }

    public static void main(String[] args) {
        //String file_name_full = "C:/Users/Administrator/Desktop/C:/Users/Administrator/Desktop/2002工程设计收费标准_要件.pdf";
        //log.debug(getInstance().getFileShortName(file_name_full));
        //log.debug(getInstance().renameFile(file_name_full, "a.txt", true));
        //testRenameFile();
        //testGetFileSize();
        //String pro_overdue = ParamBO.getInstance().getParamValue("pro_overdue");
        //System.out.println(pro_overdue.length()<1);

        //FileBO.getInstance().compressExe("D:\\2-Java在研项目\\Java_评审项目_省厅\\验证文件", "D:\\2-Java在研项目\\Java_评审项目_省厅\\验证文件.zip");
        //String str = "common\\2018/03/05/project_scheme_617_1520225962004.docx";
        //str.lastIndexOf("/");
        //FileBO.getInstance().deleteFile("E:\files_pro_approve\temp/2018/03/201803231418161699227211.docx");
        //生成压缩包
        //FileBO.getInstance().compressExe("E:\\files_pro_approve\\temp\\1522542877709", "E:\\files_pro_approve\\temp\\1522542877709.zip");
        //FileBO.getInstance().deleteDir("G:\\files\\test\\t\\",true);
    }
}
